package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.ComposicaoFamiliar;
import br.com.foxinline.enums.RendaFamiliar;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Coordenada;
import br.com.foxinline.modelo.Dimensao;
import br.com.foxinline.modelo.Endereco;
import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Imovel;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.FaceQuadraServico;
import br.com.foxinline.servico.GrupoServico;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.IptuServico;
import br.com.foxinline.servico.ItbiServico;
import br.com.foxinline.servico.PrefeituraServico;
import br.com.foxinline.servico.ProprietarioServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Conexao;
import br.com.foxinline.util.Msg;
import java.beans.Transient;
import java.io.IOException;
import java.io.Serializable;
import java.security.Principal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 *
 * @author roniere
 */
@ManagedBean
@ViewScoped
public class ManagerLayout implements Serializable {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    GrupoServico grupoServico;
    @EJB
    ImovelServico imovelServico;
    @EJB
    ItbiServico itbiServico;
    @EJB
    IptuServico iptuServico;
    @EJB
    ProprietarioServico proprietarioServico;
    @EJB
    PrefeituraServico prefeituraServico;
    @EJB
    private FaceQuadraServico faceQuadraServico;
    private String user;
    private Usuario usuarioLogado;
    /**
     * INDEX
     */
    private String cpf;
    private String inscricaoImovel;
    /**
     * Contribuinte
     */
    private MapModel mapModel;
    private Imovel visaoImovel;
    private Coordenada visualizarCoordenada;
    private String center;
    private Integer zoom;
    private String visaoInscricao = "";
    private String visaoInscricao2 = "";
    private String visaoInscricao3 = "";
    private List<Coordenada> coordenadas;
    private List<Anexo> annexs;
    private List<Anexo> annexCroquis;
    private boolean connect;
    private boolean habilitaEditarImagem = false;

    @PostConstruct
    public void init() {

        Principal userPrincipal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();

        usuarioLogado = usuarioServico.getCurrentUser();

        if (userPrincipal != null) {
            String userPrincipalName = userPrincipal.getName();

            this.user = usuarioServico.getNomeUsuario(userPrincipalName);
            String[] nome = this.user.trim().split(" ");
            if (nome.length > 1) {
                this.user = nome[0];
            }
        }

//        migrarDadosParaProprietario();
//        redirecionaUsuario(0);
    }

    public void pesquisarIptu() throws IOException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        String param = "/Atlas-war/pesquisarimovel.xhtml?";
        if (cpf != null) {
            param += "cpf=" + cpf;
            if (inscricaoImovel != null) {
                param += "&";
            }
        }
        if (inscricaoImovel != null) {
            param += "inscricaoimovel=" + inscricaoImovel;
        }
        facesContext.getExternalContext().redirect(param);
    }

    public void imprimirSegundaVia() throws Exception {
        if (visaoInscricao2 != null && !visaoInscricao2.isEmpty()) {
            List<Imovel> imoveis = imovelServico.findImovelInscCadastral(visaoInscricao2);
            if (!imoveis.isEmpty() && imoveis.size() == 1) {
                if (iptuServico.imovelValido(imoveis.get(0))) {
                    iptuServico.gerarGuia(imoveis);
                } else {
                    Msg.messagemWarn("Boleto não gerado!");
                }
            }
        } else {
            Msg.messagemWarn("Campo Inscrição Imóvel é obrigatório!");
        }
    }

    public void pesquisarItbi() throws IOException {
        if (visaoInscricao3 != null && !visaoInscricao3.isEmpty()) {
            try {
                itbiServico.validaConfigItbi();
                try {
                    List<Imovel> imoveis = imovelServico.findImovelInscCadastral(visaoInscricao3);
                    if (!imoveis.isEmpty()) {
                        Imovel imovel = imoveis.get(0);
                        itbiServico.validaImovel(imovel);
                        FacesContext facesContext = FacesContext.getCurrentInstance();
                        String param = "/Atlas-war/geraritbi.xhtml?";
                        param += "imovelId=" + imovel.getId().toString();
                        facesContext.getExternalContext().redirect(param);
                    } else {
                        Msg.messagemWarn("Imóvel não encontrado!");
                    }
                } catch (Exception e1) {
                    Msg.messagemError(e1.getMessage());
                }
            } catch (Exception e2) {
                Msg.messagemError(e2.getMessage());
            }
        } else {
            Msg.messagemWarn("Campo Inscrição Imóvel é obrigatório!");
        }
    }

    public void logout() throws IOException {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.responseComplete();
        facesContext.getExternalContext().invalidateSession();
        facesContext.getExternalContext().redirect("/Atlas-war/login.xhtml");
    }

    public void redirecionaUsuario(int cod) {
        System.out.println(cod);
        usuarioLogado = usuarioServico.getCurrentUser();
        for (Grupo g : usuarioLogado.getGrupos()) {
            if (g.getNome().equals("contribuinte")) {
                String D = usuarioLogado.getLogin().substring(0, 2);
                String S = usuarioLogado.getLogin().substring(2, 4);
                String Q = usuarioLogado.getLogin().substring(4, 7);
                String L = usuarioLogado.getLogin().substring(7, 11);
                String U = usuarioLogado.getLogin().substring(11, 13);
                Imovel imovel = imovelServico.existeImovelContribuinte(D, S, Q, L, U, usuarioLogado);
                String url = getRequestURL();
                System.out.println(url);
                if (!url.equals(url.concat("/imovelcontribuinte.xhtml"))) {
                    if (imovel != null) {
                        visaoImovel = imovel;
                        postImovel(visaoImovel);
                    }
                }
            }
            if (cod == 1 && g.getNome().equals("contribuinte")) {
                try {
                    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
                    context.redirect("imovelcontribuinte.xhtml");
                } catch (IOException ex) {
                    Logger.getLogger(Msg.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }

    public void postImovel(Imovel visaoImovel) {

        visaoImovel.setProprietarios(imovelServico.lstProprietario(visaoImovel));
        annexs = imovelServico.lstAnnexs(visaoImovel);
        if (annexs == null || annexs.isEmpty()) {
            annexs = new ArrayList<Anexo>();
        }
        annexCroquis = imovelServico.lstAnnexCroqui(visaoImovel);
        if (annexCroquis == null || annexCroquis.isEmpty()) {
            annexCroquis = new ArrayList<Anexo>();
        }
        coordenadas = imovelServico.lstCoordenadas(visaoImovel);
        if (visaoImovel.getEnderecoImovel() == null) {
            visaoImovel.setEnderecoImovel(new Endereco());
        }
        if (visaoImovel.getEnderecoCorrespondencia() == null) {
            visaoImovel.setEnderecoCorrespondencia(new Endereco());
        }
        if (visaoImovel.getDimensoes() == null) {
            visaoImovel.setDimensoes(new Dimensao());
        }

        if (visaoImovel.getEnderecoImovel() != null && visaoImovel.getEnderecoImovel().getBairroDne() == null) {
            visaoImovel.getEnderecoImovel().setBairroDne(new Bairro());
        }

        if (visaoImovel.getEnderecoCorrespondencia() != null && visaoImovel.getEnderecoCorrespondencia().getBairroDne() == null) {
            visaoImovel.getEnderecoCorrespondencia().setBairroDne(new Bairro());
        }

//        lstIptus = iptus(visaoImovel);

        DecimalFormat d = new DecimalFormat("");
        d.setMinimumIntegerDigits(2);

        visaoInscricao += d.format(visaoImovel.getInscricaoCadastralD() == null ? 0 : visaoImovel.getInscricaoCadastralD());
        visaoInscricao += d.format(visaoImovel.getInscricaoCadastralS() == null ? 0 : visaoImovel.getInscricaoCadastralS());
        d.setMinimumIntegerDigits(3);
        visaoInscricao += d.format(visaoImovel.getInscricaoCadastralQuadra() == null ? 0 : visaoImovel.getInscricaoCadastralQuadra());
        d.setMinimumIntegerDigits(4);
        d.setDecimalSeparatorAlwaysShown(false);
        visaoInscricao += d.format(visaoImovel.getInscricaoCadastralLote() == null ? 0 : visaoImovel.getInscricaoCadastralLote());
        d.setMinimumIntegerDigits(2);
        visaoInscricao += d.format(visaoImovel.getInscricaoCadastralUnid() == null ? 0 : visaoImovel.getInscricaoCadastralUnid());

        if (prefeituraServico.find().getDesabilitarMapas()) {

            this.connect = false;
        } else if (!Conexao.isInternetReachable()) {

            this.connect = false;
            Msg.messagemWarn("Não foi possível estabelecer uma conexão com a Internet.");
        } else {
            plotar();
        }

    }

    public void plotar() {
        mapModel = new DefaultMapModel();
        if (!coordenadas.isEmpty()) {
            for (Coordenada c : coordenadas) {
                LatLng coord = new LatLng(c.getLat(), c.getLog());
                center = c.getLat() + ", " + c.getLog();
                mapModel.addOverlay(new Marker(coord, visaoImovel.getProprietarios() + "", "Imóvel", getRequestURL().concat("/media/images/imovel.png")));
            }
            zoom = 17;
        }
    }

    @Transient
    private String getRequestURL() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        String requestURL = request.getRequestURL().toString();
        String url = requestURL.substring(0, requestURL.lastIndexOf("/"));
        return url;
    }

    public String mascaraCpfCnpj(Proprietario p) {
        if (p.getTipoDocumento() != null) {
            if (p.getTipoDocumento().equals(TipoDocumento.CPF)) {
                return Caracter.addMask(p.getCpf(), Caracter.cpfMask);
            } else {
                return Caracter.addMask(p.getCnpj(), Caracter.cnpjMask);
            }
        }

        return "";
    }

    public void visualizarCoordenada(Coordenada coordenada) {
        this.visualizarCoordenada = coordenada;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getMes() {
        GregorianCalendar g = new GregorianCalendar();
        g.setTime(new Date());

        return new SimpleDateFormat("MMM", new Locale("pt", "br")).format(g.getTime());
    }

    public String getAno() {
        GregorianCalendar g = new GregorianCalendar();
        g.setTime(new Date());

        return new SimpleDateFormat("yyyy", new Locale("pt", "br")).format(g.getTime());
    }

    /**
     * Verifica se o usuário logado é admin do sistema
     *
     * @return
     */
    public boolean isAdmin() {
        return usuarioServico.isAdmin();
    }

    public Usuario getUsuarioLogado() {
        return usuarioLogado;
    }

    public void setUsuarioLogado(Usuario usuarioLogado) {
        this.usuarioLogado = usuarioLogado;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getInscricaoImovel() {
        return inscricaoImovel;
    }

    public void setInscricaoImovel(String inscricaoImovel) {
        this.inscricaoImovel = inscricaoImovel;
    }

    public Imovel getVisaoImovel() {
        return visaoImovel;
    }

    public void setVisaoImovel(Imovel visaoImovel) {
        this.visaoImovel = visaoImovel;
    }

    public MapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }

    public List<Coordenada> getCoordenadas() {
        return coordenadas;
    }

    public void setCoordenadas(List<Coordenada> coordenadas) {
        this.coordenadas = coordenadas;
    }

    public List<Anexo> getAnnexs() {
        return annexs;
    }

    public void setAnnexs(List<Anexo> annexs) {
        this.annexs = annexs;
    }

    public List<Anexo> getAnnexCroquis() {
        return annexCroquis;
    }

    public void setAnnexCroquis(List<Anexo> annexCroquis) {
        this.annexCroquis = annexCroquis;
    }

    public String getCenter() {
        return center;
    }

    public void setCenter(String center) {
        this.center = center;
    }

    public Integer getZoom() {
        return zoom;
    }

    public void setZoom(Integer zoom) {
        this.zoom = zoom;
    }

    public String getVisaoInscricao() {
        return visaoInscricao;
    }

    public void setVisaoInscricao(String visaoInscricao) {
        this.visaoInscricao = visaoInscricao;
    }

    public boolean isConnect() {
        return connect;
    }

    public void setConnect(boolean connect) {
        this.connect = connect;
    }

    public String getVisaoInscricao2() {
        return visaoInscricao2;
    }

    public void setVisaoInscricao2(String visaoInscricao2) {
        this.visaoInscricao2 = visaoInscricao2;
    }

    public String getVisaoInscricao3() {
        return visaoInscricao3;
    }

    public void setVisaoInscricao3(String visaoInscricao3) {
        this.visaoInscricao3 = visaoInscricao3;
    }

    private void migrarDadosParaProprietario() {
        Proprietario proprietario;

        for (Object[] object : imovelServico.migrarDadosParaProprietario()) {

            proprietario = proprietarioServico.find((Long) object[0]);
            proprietario.setTempoMoradia((String) object[1]);
            proprietario.setTempoMoradiaMunicipio((String) object[2]);
            proprietario.setBolsaFamilia((Boolean) object[3]);
            proprietario.setValorBolsaFamilia((Double) object[4]);
            proprietario.setMinhaCasaMinhaVida((Boolean) object[5]);

            for (ComposicaoFamiliar composicaoFamiliar : ComposicaoFamiliar.values()) {
                if (composicaoFamiliar.name().equals((String) object[6])) {
                    proprietario.setComposicaoFamiliar(composicaoFamiliar);
                    break;
                }
            }

            for (RendaFamiliar rendaFamiliar : RendaFamiliar.values()) {
                if (rendaFamiliar.name().equals((String) object[7])) {
                    proprietario.setRendaFamiliar(rendaFamiliar);
                    break;
                }
            }

            proprietarioServico.update(proprietario);

            // 0 - proprietarios_id
            // 1 - tempomoradia
            // 2 - tempomoradiamunicipio
            // 3 - bolsafamilia
            // 4 - valorbolsafamilia
            // 5 - minhacasaminhavida
            // 6 - composicaofamiliar
            // 7 - rendafamiliar
        }
    }

    public boolean desabilitarMapa() {
        return prefeituraServico.find().getDesabilitarMapas();
    }
//    public void atualizarFacesQuadra(){
//        faceQuadraServico.atualizarFaceQuadra();
//    }

    public boolean isHabilitaEditarImagem() {
        return habilitaEditarImagem;
    }

    public void setHabilitaEditarImagem(boolean habilitaEditarImagem) {
        this.habilitaEditarImagem = habilitaEditarImagem;
    }
    
}
